﻿using GMME.Model.Rtm.Req;
using GMME.Model.Rtm.Result;

namespace GMME
{
    public enum IGMMERoomType
    {
        IGMME_ROOM_TYPE_TEAM = 1, //小队语音房间类型
        IGMME_ROOM_TYPE_NATIONAL = 2, //国战语音房间类型
        IGMME_ROOM_TYPE_RANGE = 3, //范围语音房间类型
    };

    public abstract class GameMediaEngine
    {
        /**
         * 创建游戏多媒体引擎
         *
         * @param params 用户创建引擎参数
         * @param eventHandler 事件回调
         * @return GameAudioEngine 创建的多媒体引擎实例
         */
        public static GameMediaEngine Create(EngineCreateParams engineParams, IGameMMEEventHandler callBackHandler)
        {
#if UNITY_ANDROID && !UNITY_EDITOR
            return GameMediaEngineForAndroid.GetInstance().CreateEngine(engineParams, callBackHandler);
#elif UNITY_IOS && !UNITY_EDITOR
            return GameMediaEngineForIos.GetInstance().CreateEngine(engineParams, callBackHandler);
#elif UNITY_EDITOR
            return GameMediaEngineForEditor.GetInstance().CreateEngine(engineParams, callBackHandler);
#else
            return null;
#endif
        }

        /**
         * 销毁引擎
         */
        public static void Destroy()
        {
#if UNITY_ANDROID && !UNITY_EDITOR
            GameMediaEngineForAndroid.GetInstance().DestroyEngine();
#elif UNITY_IOS && !UNITY_EDITOR
            GameMediaEngineForIos.GetInstance().DestroyEngine();
#elif UNITY_EDITOR
            GameMediaEngineForEditor.GetInstance().DestroyEngine();
#endif
        }


        /**
          * 玩家加入小队语音房间，包含创建房间
         *
         * @param roomId 房间Id
         */
        public abstract void JoinTeamRoom(string roomId);


        /**
         * 玩家加入国战语音房间
         *
         * @param roomId 房间Id
         * @param roleType 角色类型
         */
        public abstract void JoinNationalRoom(string roomId, int roleType);

        /**
        * 玩家加入范围语音房间
        *
        * @param roomId 房间Id
=        */
        public abstract void JoinRangeRoom(string roomId);

        /**
         * 切换房间
         *
         * @param roomId 房间Id
         */
        public abstract void SwitchRoom(string roomId);


        /**
         * 离开房间
         *
         * @param roomId 房间Id
         * @param ownerId 指定下任房主ID,不传代表随机指定
         */
        public abstract void LeaveRoom(string roomId, string ownerId);


        /**
         * 玩家（房主）修改房间
         *
         * @param roomId 房间Id
         * @param ownerId 房主Id
         */
        public abstract void TransferOwner(string roomId, string ownerId);


        /**
         * 静默玩家自身语音
         *
         * @param isEnabled 是否禁言自身 true:正常 false:禁言
         * @return 响应结果
         */
        public abstract int EnableMic(bool isEnabled);


        /**
         * 屏蔽指定玩家语音
         *
         * @param roomId 房间Id
         * @param openId 指定屏蔽玩家账号
         * @param isMuted 是否屏蔽指定玩家
         */
        public abstract void MutePlayer(string roomId, string openId, bool isMuted);

        /**
         * 屏蔽全部玩家
         *
         * @param roomId 房间Id
         * @param isMuted 是否屏蔽所有其他玩家
         */
        public abstract void MuteAllPlayers(string roomId, bool isMuted);

        /**
         * 用户获取指定房间信息
         *
         * @param roomId 房间Id
         * @return 返回当前房间信息
         */
        public abstract Room GetRoom(string roomId);

        /**
         * 开启音量回调，用于获取当前房间发言人
         *
         * @param roomId 房间Id
         * @param interval 音量值上报周期, 默认关闭音量回调 0:关闭音量回调 [100, 10000]: 有效值范围，单位: 毫秒
         */
        public abstract void EnableSpeakersDetection(string roomId, int interval);

        /**
         * 房主禁言全部玩家
         *
         * @param roomId 房间Id
         * @param isForbidden 是否禁言其他玩家 true:禁言 false:正常
         */
        public abstract void ForbidAllPlayers(string roomId, bool isForbidden);

        /**
         * 房主禁言指定玩家
         *
         * @param roomId 房间Id
         * @param openId 禁言玩家ID
         * @param isForbidden 是否禁言其他玩家 true:禁言 false:正常
         */
        public abstract void ForbidPlayer(string roomId, string openId, bool isForbidden);

        /**
         * 实时语音变声-设置房间变声类型
         *
         * @param roomId 房间id
         * @param voiceType 变声类型
         */
        public abstract int EnableVoiceConversion(string roomId, int voiceType);

        /**
         * 获取房间变声类型
         *
         * @param roomId 房间id
         */
        public abstract int GetVoiceConversionType(string roomId);

        /**
         * 开启/关闭耳返
         *
         * @param enable 是否开启耳返
         */
        public abstract int EnableEarsBack(bool enable);

        /**
         * 耳返是否开启状态
         */
        public abstract bool IsEarsBackEnable();

        /**
         * 开始录音
         *
         * @param voiceParam 语音转文字入参
         */
        public abstract void StartRecordAudioToText(VoiceParam voiceParam);

        /**
         * 停止录音
         */
        public abstract void StopRecordAudioToText();

        /**
         * 开始录制语音消息
         *
         * @param filePath 文件路径
         */
        public abstract void StartRecordAudioMsg(string filePath);

        /**
         * 开始录制语音消息
         *
         * @param filePath 录音文件存储的地址路径
         * @param voiceType 变声类型
         */
        public abstract void StartRecordAudioMsg(string filePath, int voiceType);

        /**
         * 结束录制语音消息
         * 
         * @param filePath 文件路径
         */
        public abstract void StopRecordAudioMsg();

        /**
         * 上传语音消息
         *
         * @param filePath 文件路径
         * @param msTimeOut 超时时间（毫秒）
         */
        public abstract void UploadAudioMsgFile(string filePath, int msTimeOut);

        /**
         * 下载语音消息
         *
         * @param fileId 文件ID
         * @param filePath 文件路径
         * @param msTimeOut 超时时间（毫秒）
         */
        public abstract void DownloadAudioMsgFile(string fileId, string filePath, int msTimeOut);

        /**
         * 获取语音消息信息
         *
         * @param filePath 文件路径
         * @return AudioMsgFileInfo 语音消息信息
         */
        public abstract AudioMsgFileInfo GetAudioMsgFileInfo(string filePath);

        /**
         * 播放语音消息
         *
         * @param filePath 文件路径
         */
        public abstract void PlayAudioMsg(string filePath);


        /**
         * 停止播放语音消息
         * 
         */
        public abstract void StopPlayAudioMsg();
        
        /**
         * 语音消息风控
         * 
         */
        public abstract void StartDetectAudioFile(string fileId);

        /**
         * 本地播放音效文件
         * 
         * @param localAudioInfo 本地语音信息
         * @return 调用状态
        */
        public abstract int PlayLocalAudioClip(LocalAudioInfo localAudioInfo);

        /**
         * 停止播放指定本地音效
         * 
         * @param soundId 音效ID
         * @return 调用状态
         */
        public abstract int StopLocalAudioClip(int soundId);

        /**
         * 停止播放所有本地音效
         *
         *  @return 调用状态
         */
        public abstract int StopAllLocalAudioClips();

        /**
         * 暂停播放指定本地音效
         *
         * @param soundId 音效ID
         * @return 调用状态
         */
        public abstract int PauseLocalAudioClip(int soundId);

        /**
         * 暂停播放所有本地音效
         * 
         * @param native  实例对象
         * @return 调用状态
         */
        public abstract int PauseAllLocalAudioClips();

        /**
         * 恢复播放指定本地音效
         * 
         * @param soundId 音效ID
         * @return 调用状态
         */
        public abstract int ResumeLocalAudioClip(int soundId);

        /**
         * 恢复播放所有本地音效
         * 
         * @return 调用状态
         */
        public abstract int ResumeAllLocalAudioClips();

        /**
         * 获取指定soundId本地音效音量
         *
         * @param soundId 音效ID
         * @return 0-100正常值 -1是异常
         */
        public abstract int GetVolumeOfLocalAudioClip(int soundId);

        /**
         * 获取本地音效总音量
         *
         * @return 0-100正常值 -1是异常
         */
        public abstract int GetLocalAudioClipsVolume();

        /**
         * 设置指定soundId本地音效音量
         *
         * @param soundId 音效ID
         * @param volume 音量
         * @return 调用状态
         */
        public abstract int SetVolumeOfLocalAudioClip(int soundId, int volume);

        /**
         * 设置本地音效总音量
         * 
         * @param native  实例对象
         * @param volume 音量
         * @return 调用状态
         */
        public abstract int SetLocalAudioClipsVolume(int volume);

        /**
         * 设置范围语音的接收范围
         * 
         * @param range 范围
         * @return 设置结果
         */
        public abstract int SetAudioRecvRange(int range);


        /**
         * 设置自身的位置坐标
         * 
         * @param selfPosition 当前玩家的坐标信息
         * @return 设置结果
         */
        public abstract int UpdateSelfPosition(SelfPosition selfPosition);

        /**
         * 设置远端玩家的位置坐标
         * 
         * @param positions 远端玩家的位置坐标
         * @return 设置结果
         */
        public abstract int UpdateRemotePosition(RemotePlayerPosition[] positions);

        /**
         * 清理所有玩家的位置坐标
         * 
         */
        public abstract void ClearAllRemotePositions();

        /**
         * 清理指定玩家的位置坐标
         * 
         * @param openId 被清理玩家Id
         */
        public abstract void ClearRemotePlayerPosition(string openId);

        /**
         * 初始化3D音效
         * 
         * @return 调用状态
         */
        public abstract int InitSpatialSound();

        /**
         * 开启关闭3D音效
         * 
         * @param roomId 房间Id
         * @param enable  true:开启 false:关闭
         * @return 调用状态
         */
        public abstract int EnableSpatialSound(string roomId, bool enable);


        /**
         * 获取3D音效状态
         * 
         * @param roomId 房间Id
         * @return   true:开启 false:关闭
         */
        public abstract bool IsEnableSpatialSound(string roomId);

        #region rtm

        /**
         * 订阅RTM频道
         *
         * @param req 订阅RTM频道请求对象
         */
        public abstract void SubscribeRtmChannel(SubscribeRtmChannelReq req);

        /**
         * 取消订阅RTM频道
         *
         * @param req 取消订阅RTM频道请求对象
         */
        public abstract void UnSubscribeRtmChannel(UnSubscribeRtmChannelReq req);

        /**
         * 查询已订阅RTM频道信息
         *
         * @return 已订阅频道结果
         */
        public abstract GetRtmSubscribedChannelInfoResult GetRtmSubscribedChannelInfo();

        /**
         * 查询RTM频道信息
         *
         * @param req 查询RTM频道信息请求对象
         */
        public abstract void GetRtmChannelInfo(GetRtmChannelInfoReq req);

        /**
         * 发布RTM频道信息
         *
         * @param req 发布RTM频道信息请求对象
         * @return 客户端本地生成的 clientMsgId
         */
        public abstract string PublishRtmChannelMessage(PublishRtmChannelMessageReq req);

        /**
         * 发布RTM点对点信息
         *
         * @param req 发布RTM点对点信息请求对象
         * @return 客户端本地生成的 clientMsgId
         */
        public abstract string PublishRtmPeerMessage(PublishRtmPeerMessageReq req);

        /**
         * 设置RTM频道内玩家属性
         *
         * @param req 设置RTM频道内玩家属性请求对象
         */
        public abstract void SetRtmChannelPlayerProperties(SetRtmChannelPlayerPropertiesReq req);

        /**
         * 查询RTM频道内玩家属性
         *
         * @param req 查询RTM频道内玩家属性请求对象
         */
        public abstract void GetRtmChannelPlayerProperties(GetRtmChannelPlayerPropertiesReq req);

        /**
         * 删除RTM频道内玩家属性
         *
         * @param req 删除RTM频道内玩家属性请求对象
         */
        public abstract void DeleteRtmChannelPlayerProperties(DeleteRtmChannelPlayerPropertiesReq req);

        /**
         * 设置RTM频道属性
         *
         * @param req 设置RTM频道属性请求对象
         */
        public abstract void SetRtmChannelProperties(SetRtmChannelPropertiesReq req);

        /**
         * 查询RTM频道属性
         *
         * @param req 查询RTM频道属性请求对象
         */
        public abstract void GetRtmChannelProperties(GetRtmChannelPropertiesReq req);

        /**
         * 删除RTM频道属性
         *
         * @param req 删除RTM频道属性请求对象
         */
        public abstract void DeleteRtmChannelProperties(DeleteRtmChannelPropertiesReq req);

        /**
         * 查询RTM频道历史消息
         *
         * @param req 查询RTM频道历史消息请求对象
         */
        public abstract void GetRtmChannelHistoryMessages(GetRtmChannelHistoryMessagesReq req);

        #endregion
    }
}